package cn.edu.jsu.nrs.dao.impl;
import java.sql.SQLException;
import java.util.List;

import javax.annotation.Resource;

import org.hibernate.HibernateException;
import org.hibernate.Query;
import org.hibernate.Session;
import org.springframework.orm.hibernate3.HibernateCallback;
import org.springframework.orm.hibernate3.HibernateTemplate;
import org.springframework.stereotype.Component;
import cn.edu.jsu.nrs.dao.ReplyDao;
import cn.edu.jsu.nrs.model.Reply;

/**
 * 
 * @author:YYH
 * @date:2013-1-24 下午08:58:25
 * @update-date:2013-1-24 下午08:58:25
 * @version:1.0
 * @project_name:NewsReleaseSystem
 * @description:回复帖子数据库访问接口实现
 */
@Component(value="replyDao")
public class ReplyDaoImpl implements ReplyDao {
	private HibernateTemplate hibernateTemplate;
	
	/***
	 * 保存帖子回复
	 */
	public int save(Reply reply) {
		return (Integer)hibernateTemplate.save(reply);
	}
	/***
	 * 更新帖子回复
	 */
	public void update(Reply reply) {
		hibernateTemplate.update(reply);
	}
	
	/**
	 * 获取最后的跟贴
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public Reply getLastReply(){
		List<Reply> replies=hibernateTemplate.executeFind(new HibernateCallback() {
			public Object doInHibernate(Session s) throws HibernateException,
					SQLException {
				Query query=s.createQuery("from Reply order by reply_id desc");
				query.setFirstResult(0);
				query.setMaxResults(1);
				
				return query.list();
			}
		});
		return replies.get(0);
	}
	/****
	 * 根据id查询帖子回复
	 */
	public Reply queryReplyById(int id) {
		return (Reply)hibernateTemplate.get(Reply.class, id);
	}
	
	/**
	 * 查询所有回复
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<Reply> queryReplies(){
		return hibernateTemplate.find("from Reply");
	}
	
	
	/**
	 * 根据新闻查询跟贴
	 * reply_id和parent_id相同，表示新闻的跟贴，如果不相同，表示跟贴的评论回复。
	 */
	@SuppressWarnings("unchecked")
	public List<Reply> queryRepliesByNewsId(int newsId) {
		return hibernateTemplate.find("from Reply where news_id=? and parent_id=reply_id",newsId);//返回第一级评论列表
	}
	
	/**
	 * 查询某一个新闻的贴子数
	 * reply_id和parent_id相同，表示新闻的跟贴，如果不相同，表示跟贴的评论回复。
	 * @param newsId
	 * @return
	 */
	public int count(final int newsId){
		return hibernateTemplate.find("from Reply where news_id=? and parent_id=reply_id",newsId).size();
	}
	
	/**
	 * 根据新闻ID分页查询新闻跟帖列表
	 * @param newsId
	 * @param beginIndex
	 * @param size
	 * @return
	 */
	@SuppressWarnings("unchecked")
	public List<Reply> queryPagingReplyListByNewsId(final int newsId,final int beginIndex,final int size){
		List<Reply> replies=hibernateTemplate.executeFind(new HibernateCallback() {
			public Object doInHibernate(Session session) throws HibernateException,
					SQLException {
				Query query=session.createQuery("from Reply where news_id=? and  reply_id=parent_id order by replyTime desc");
				query.setInteger(0, newsId);
				query.setFirstResult(beginIndex);
				query.setMaxResults(size);
				return query.list();
			}
		});
		return replies;
	}
	
	/***
	 * 删除帖子
	 */
	public void delete(Reply reply) {
		this.delete(reply);
	}
	/***
	 * 根据帖子id删除帖子
	 */
	public int deleteReplyById(int id) {
		return hibernateTemplate.bulkUpdate("delete from Reply where id=?",id);
	}

	@Resource
	public void setHibernateTemplate(HibernateTemplate hibernateTemplate) {
		this.hibernateTemplate = hibernateTemplate;
	}
}
